package com.coekie.flowtracker.weaver;

/*-
 * Copyright 2024 Wouter Coekaerts
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.objectweb.asm.ClassVisitor;

/** Creates adapters by wrapping a {@link ClassVisitor} */
public interface Transformer {
  /** Wrap the given {@link ClassVisitor} in an adapter. */
  ClassVisitor transform(ClassLoader classLoader, String className, ClassVisitor cv);

  /** Combine two ClassAdapterFactories */
  static Transformer and(Transformer first, Transformer andThen) {
    if (first == null) return andThen;
    if (andThen == null) return first;
    return (classLoader, className, cv) ->
        andThen.transform(classLoader, className, first.transform(classLoader, className, cv));
  }
}
